9761a7f56b626266458f29176edbb2bf34c02861,src/com/redhat/ceylon/compiler/java/codegen/CallableBuilder.java,CallMethodForVariadic,makeMethod,#number#,706
Before Change
}
if (a < getMinimumArguments()) {
// append the downcast parameter
stmts.append(makeDowncastOrDefaultVar(
getCallableTempVarName(param, forwardCallTo), param, a, arity, forwardCallTo));
args.append(getCallableTempVarName(param, forwardCallTo).makeIdent());
} else {
break;
}
}
for (; args.size() < numParams; a++) {
Parameter param = paramLists.getParameters().get(a);
if (param.isSequenced()) {
//args.append(gen.makeEmptyAsSequential(true));
a = makeSequencedArgument(arity, stmts, args, a);
} else {
SyntheticName name = getCallableTempVarName(param, forwardCallTo);
stmts.append(makeDowncastOrDefaultVar(
name, param, a, arity, forwardCallTo));
args.append(name.makeIdent());
}
}
} else { // we're generating the $call(Object...) method
// THE OLD CODE
// pass along the parameters
Parameter variadicParameter = getVariadicParameter();
int a = 0;
for(Parameter param : paramLists.getParameters()){
// don't read default parameter values for forwarded calls
if(param.isSequenced())
break;
stmts.append(makeDowncastOrDefaultVar(
getCallableTempVarName(param, forwardCallTo), param, a, arity, forwardCallTo));
args.append(getCallableTempVarName(param, forwardCallTo).makeIdent());
a++;
}
ListBuffer<JCExpression> varargs = ListBuffer.<JCExpression>lb();
if (arity > CALLABLE_MAX_FIZED_ARITY) {
args.append(makeRespread(
List.<JCExpression>of(
gen.makeReifiedTypeArgument(getVariadicIteratedType()),
gen.make().Literal(numParams-1),
gen.make().Binary(JCTree.MINUS, gen.naming.makeQualIdent(makeParamIdent(gen, 0), "length"), gen.make().Literal(numParams-1)),
makeParamIdent(gen, 0),
gen.makeEmpty())));
} else {
JCExpression varargsSequence;
for (int j = getMinimumParameters(); j < arity; j++) {
Parameter param = paramLists.getParameters().get(Math.min(j, numParams-1));
if (arity < numParams - 1) {
stmts.append(makeDowncastOrDefaultVar(
getCallableTempVarName(param, forwardCallTo), param, j, arity, forwardCallTo));
} else {
varargs.append(gen.make().Ident(makeParamName(gen, j)));
}
}
// TODO Sometimes we need to call Util.sequentialInstance
if (varargs.isEmpty()) {
varargsSequence = gen.makeEmptyAsSequential(true);
} else {
varargsSequence = gen.makeSequence(varargs.toList(),
getVariadicIteratedType(), 0);
}
SyntheticName vname = getCallableTempVarName(getVariadicParameter(), forwardCallTo).suffixedBy("$");
args.append(vname.makeIdent());
stmts.append(makeVar(variadicParameter, getVariadicType(),
forwardCallTo, vname, varargsSequence));
}
// /THE OLD CODE
}
After Change
}
if (a < getMinimumArguments()) {
// append the downcast parameter
makeDowncastOrDefaultVar(stmts,
getCallableTempVarName(param, forwardCallTo), param, a, arity, forwardCallTo);
args.append(getCallableTempVarName(param, forwardCallTo).makeIdent());
} else {
break;
}
}
for (; args.size() < numParams; a++) {
Parameter param = paramLists.getParameters().get(a);
if (param.isSequenced()) {
//args.append(gen.makeEmptyAsSequential(true));
a = makeSequencedArgument(arity, stmts, args, a);
} else {
SyntheticName name = getCallableTempVarName(param, forwardCallTo);
makeDowncastOrDefaultVar(stmts,
name, param, a, arity, forwardCallTo);
args.append(name.makeIdent());
}
}
} else { // we're generating the $call(Object...) method
// THE OLD CODE
// pass along the parameters
Parameter variadicParameter = getVariadicParameter();
int a = 0;
for(Parameter param : paramLists.getParameters()){
// don't read default parameter values for forwarded calls
if(param.isSequenced())
break;
makeDowncastOrDefaultVar(stmts,
getCallableTempVarName(param, forwardCallTo), param, a, arity, forwardCallTo);
args.append(getCallableTempVarName(param, forwardCallTo).makeIdent());
a++;
}
ListBuffer<JCExpression> varargs = ListBuffer.<JCExpression>lb();
if (arity > CALLABLE_MAX_FIZED_ARITY) {
args.append(makeRespread(
List.<JCExpression>of(
gen.makeReifiedTypeArgument(getVariadicIteratedType()),
gen.make().Literal(numParams-1),
gen.make().Binary(JCTree.MINUS, gen.naming.makeQualIdent(makeParamIdent(gen, 0), "length"), gen.make().Literal(numParams-1)),
makeParamIdent(gen, 0),
gen.makeEmpty())));
} else {
JCExpression varargsSequence;
for (int j = getMinimumParameters(); j < arity; j++) {
Parameter param = paramLists.getParameters().get(Math.min(j, numParams-1));
if (arity < numParams - 1) {
makeDowncastOrDefaultVar(stmts,
getCallableTempVarName(param, forwardCallTo), param, j, arity, forwardCallTo);
} else {
varargs.append(gen.make().Ident(makeParamName(gen, j)));
}
}
// TODO Sometimes we need to call Util.sequentialInstance
if (varargs.isEmpty()) {
varargsSequence = gen.makeEmptyAsSequential(true);
} else {
varargsSequence = gen.makeSequence(varargs.toList(),
getVariadicIteratedType(), 0);
}
SyntheticName vname = getCallableTempVarName(getVariadicParameter(), forwardCallTo).suffixedBy("$");
args.append(vname.makeIdent());
makeVar(stmts, variadicParameter, getVariadicType(),
forwardCallTo, vname, varargsSequence);
}
// /THE OLD CODE
}